package com.cskaoyan.javase.array.memory4;

/**
 * @description: 练习3
 * @author: wuguidong@cskaoyan.onaliyun.com
 **/

/**
 * 定义两个数组
 * - 静态初始化一个数组，输出数组名，元素取值，长度
 * - 然后声明第二个数组，把第一个数组的数组名赋值给第二个数组。
 * - 输出第二个数组的数组名，元素取值，长度
 * - 然后给第二个数组赋值，再次输出两个数组的名及元素
 *
 * 当一个引用给另一个引用赋值arr2 = arr1;
 * 相当于把地址给它了
 * 这时候两个引用指向了同一个对象，这时候这个对象有了两个名字，通过这两个名字都可以访问一个对象
 * 注意：
 * 通过某一个引用偷偷改了对象的取值，操作了对象
 * 然后另一个引用也要跟着改变了
 * 本质上指向同一个对象
 *
 */
public class Demo7 {
    public static void main(String[] args) {

        //静态初始化一个数组
        int[] arr1 = {1,2,3};
        System.out.println(arr1); //地址
        System.out.println(arr1[0]); //1
        System.out.println(arr1[1]); //2
        System.out.println(arr1[2]);//3
        System.out.println(arr1.length);//3
        //声明一个数组，并没有在堆上创建数组
        int[] arr2;
        //把第一个数组的数组名赋值给arr2
        //引用中装的是地址
        //相当于两个引用指向了同一个对象（数组）
        arr2 = arr1;
        System.out.println(arr2); //arr2和arr1地址一样
        System.out.println(arr2[0]);//1
        System.out.println(arr2[1]);//2
        System.out.println(arr2[2]);//3
        System.out.println(arr2.length);//3

        //然后给第二个数组赋值，再次输出两个数组的名及元素
        arr2[0] = 666;
        arr2[1] = 777;
        arr2[2] = 888;

        //再次输出数组名和元素值
        System.out.println("修改数组2后数组1的内容：");
        System.out.println(arr1); //地址不变
        System.out.println(arr1[0]); //666
        System.out.println(arr1[1]); //777
        System.out.println(arr1[2]);//888
        System.out.println(arr1.length);//3


        System.out.println("修改数组2后数组2的内容：");
        System.out.println(arr2); // 地址不变
        System.out.println(arr2[0]);//666
        System.out.println(arr2[1]);//777
        System.out.println(arr2[2]);//888
        System.out.println(arr2.length);//3



    }
}
